home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1993-12-02 | 9.8 KB | 209 lines |
- DEFINITION MODULE lib;
- __DEF_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (*****************************************************************************)
- (* Verschiedene Bibliotheksfunktionen *)
- (* --------------------------------------------------------------------------*)
- (* 27-Nov-93, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- FROM SYSTEM IMPORT
- (* TYPE *) ADDRESS;
-
- FROM PORTAB IMPORT
- (* TYPE *) UNSIGNEDLONG, SIGNEDLONG;
-
- #ifdef TSM2_1
- FROM AsmLib IMPORT LongLabel;
- #endif
-
- (*=========================== "rand()" ======================================*)
-
- CONST
- RandMax = 7FFFFFFFH;
-
- (*================ "lfind()", "bsearch()", "qsort()" ========================*)
-
- TYPE
- CompareProc = PROCEDURE ((* par1 *) ADDRESS,
- (* par2 *) ADDRESS ): INTEGER;
-
- (* par1^ < par2^ ==> < 0
- * par1^ = par2^ ==> = 0
- * par1^ > par2^ ==> > 0
- *
- *
- * Beispiel:
- *
- * PROCEDURE cmp ((* EIN/ -- *) op1,
- * (* EIN/ -- *) op2 : ADDRESS ): INTEGER;
- *
- * TYPE ElemPtr = POINTER TO REAL; (* je nach Elementtyp *)
- *
- * VAR ptr1 : ElemPtr;
- * ptr2 : ElemPtr;
- *
- * BEGIN
- * ptr1 := op1;
- * ptr2 := op2;
- *
- * IF ptr1^ < ptr2^ THEN
- * RETURN(-1);
- * ELSIF ptr1^ > ptr2^ THEN
- * RETURN(1);
- * ELSE
- * RETURN(0);
- * END;
- * END cmp;
- *)
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- (* nicht POSIX: *)
- PROCEDURE lfind ((* EIN/ -- *) key : ADDRESS;
- (* EIN/ -- *) base : ADDRESS;
- (* EIN/ -- *) nelems : UNSIGNEDLONG;
- (* EIN/ -- *) size : UNSIGNEDLONG;
- (* EIN/ -- *) compare : CompareProc ): ADDRESS;
-
- (*--------------------------------------------------------------------------
- | Prozedur fuer lineare Suche in einem Feld aus gleichartigen, direkt hin- |
- | tereinander angeordneten Elementen (ACHTUNG: Fuellbytes muessen bei der |
- | Angabe von <size> beruecksichtigt werden!). |
- | Falls das gesuchte Element gefunden wird, ist der Funktionswert dessen |
- | Adresse im Feld, sonst wird NULL zurueckgeliefert. |
- | |
- | <base> ist die Adresse des ersten Elementes des Feldes |
- | <nelems> ist die Anzahl der Feldelemente |
- | <size> ist die Groesse eine Feldelementes in Bytes |
- | <compare> ist die Vergleichsfunktion (siehe Def. 'CompareProc') |
- | <key> ist die Adresse des gesuchten Elementes |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE bsearch ((* EIN/ -- *) key : ADDRESS;
- (* EIN/ -- *) base : ADDRESS;
- (* EIN/ -- *) nelems : UNSIGNEDLONG;
- (* EIN/ -- *) size : UNSIGNEDLONG;
- (* EIN/ -- *) compare : CompareProc ): ADDRESS;
-
-
- (*--------------------------------------------------------------------------
- | Prozedur fuer binaere Suche in einem Feld aus gleichartigen, direkt hin- |
- | tereinander angeordneten Elementen. Die Elemente muessen gemaess der |
- | verwendeten Vergleichsprozedur aufsteigend sortiert sein. |
- | Falls das gesuchte Element gefunden wird, ist der Funktionswert dessen |
- | Adresse im Feld, sonst wird NULL zurueckgeliefert. |
- | |
- | Bedeutung der Parameter siehe: "lfind()" |
- --------------------------------------------------------------------------*)
-
-
-
-
- PROCEDURE qsort ((* EIN/ -- *) base : ADDRESS;
- (* EIN/ -- *) nelems : UNSIGNEDLONG;
- (* EIN/ -- *) size : UNSIGNEDLONG;
- (* EIN/ -- *) compare : CompareProc );
-
- (*--------------------------------------------------------------------------
- | Prozedur fuer Sortierung nach dem ``Quicksort''-Algorithmus in einem Feld|
- | aus gleichartigen, direkt hintereinander angeordneten Elementen. |
- | Die Sortierung ist nicht stabil, d.h. es ist nicht garantiert, dass die |
- | relative Ordnung von Elementen mit gleichem (Neben-)Schluessel erhalten |
- | bleibt. |
- | Stackbelastung: O(log(nelems)) |
- | |
- | Bedeutung der Parameter siehe: "lfind()" |
- --------------------------------------------------------------------------*)
-
-
-
-
- (* nicht POSIX: *)
- PROCEDURE ltoa ((* EIN/ -- *) n : SIGNEDLONG;
- (* -- /AUS *) VAR str : ARRAY OF CHAR;
- (* EIN/ -- *) base : CARDINAL );
-
- PROCEDURE ultoa ((* EIN/ -- *) n : UNSIGNEDLONG;
- (* -- /AUS *) VAR str : ARRAY OF CHAR;
- (* EIN/ -- *) base : CARDINAL );
-
- (*--------------------------------------------------------------------------
- | Wandeln den Wert <n> in eine Stringrepraesentation um. Es wird die kuer- |
- | zest moegliche Darstellung gewaehlt, d.h. es werden keine fuehrenden |
- | Nullen geschrieben, und bei positiven Zahlen wird kein Leerzeichen oder |
- | ein Plus verwendet. <base> bestimmt die Basis der Zahlendarstellung und |
- | muss innerhalb von [2..36] liegen; liegt <base> ausserhalb, wird Zehn |
- | angenommen. |
- --------------------------------------------------------------------------*)
-
-
- (* nicht POSIX: *)
- PROCEDURE strtol ((* EIN/ -- *) REF str : ARRAY OF CHAR;
- (* -- /AUS *) VAR end : CARDINAL;
- (* EIN/ -- *) base : CARDINAL ): SIGNEDLONG;
-
- PROCEDURE strtoul ((* EIN/ -- *) REF str : ARRAY OF CHAR;
- (* -- /AUS *) VAR end : CARDINAL;
- (* EIN/ -- *) base : CARDINAL ): UNSIGNEDLONG;
-
- (*--------------------------------------------------------------------------
- | Wandelt die Stringrepraesentation <str> einer Zahl in ihre interne Dar- |
- | stellung, die als Funktionswert geliefert wird. Die Stringrepraesentation|
- | muss der weiter unten angegebenen Syntax genuegen. |
- | |
- | <end> ist der Index des ersten fuer die Umwandlung nicht mehr benutzten |
- | Zeichens; dieser kann auch ausserhalb von <str> liegen, falls die Reprae-|
- | sentation durch das Stringende begrenzt wurde. |
- | <base> ist die gewuenschte Basis der Zahl. gueltige Werte sind 0 und 2 |
- | bis 36; andere Werte werden zu Null korrigiert. Ist <base> gleich Null, |
- | wird die Basis der Repraesentation entnommen, d.h. es koennen Binaer-, |
- | Oktal- und Sedezimalzahlen erkannt werden; ist der Zahl keine Basis vor- |
- | angestellt, wird eine Dezimalzahl erwartet. Ist <base> gleich 2, 8 oder |
- | 16, so kann trotzdem zusaetzlich eine Basis der Zahl vorangestellt sein, |
- | sie wird aber ignoriert, solange sie dem Wert von <base> entspricht. |
- | |
- | Wenn bei der Umwandlung ein Ueberlauf auftritt, wird als Funktionswert |
- | der jeweils groesst/kleinstmoegliche Wert zurueckgeliefert und 'errno' |
- | auf 'ERANGE' gesetzt. |
- | |
- | Die Syntax: |
- | |
- | whole ::= {SPACE}['+'|'-']('%'bin)|('$'hex)|('0'octHexNull)|(num) |
- | Stringende|keine gueltige Ziffer |
- | octHexNull ::= ('x'|'X')hex|oct| e (* leer, fuer die NULL *) |
- | bin ::= bindigit{bindigit} |
- | oct ::= octdigit{octdigit} |
- | hex ::= hexdigit{hexdigit} |
- | num ::= digit{digit} |
- | bindigit ::= '0'|'1' |
- | octdigit ::= bindigit|'2'..'7' |
- | hexdigit ::= octdigit|'8'|'9'|'a'..'f'|'A'..'F' |
- | digit ::= hexdigit|'g'..'z'|'G'..'Z' |
- --------------------------------------------------------------------------*)
-
-
-
- PROCEDURE rand ( ): UNSIGNEDLONG;
-
- PROCEDURE srand ((* EIN/ -- *) seed : UNSIGNEDLONG );
-
- (*--------------------------------------------------------------------------
- | "rand()" liefert eine Pseudozufallszahl im Bereich [0..MAXRAND]. Die |
- | jeweils letzte Zufallszahl wird gemerkt und als Ausgangspunkt fuer die |
- | Berechnung der naechsten verwendet. Mit "srand()" kann dieser Ausgangs- |
- | punkt explizit gesetzt werden, sodass reproduzierbare Zahlenfolgen moeg- |
- | lich sind. Zu Programmstart wird als Ausgangswert die eins verwendet. |
- --------------------------------------------------------------------------*)
-
- END lib.
-